-
Notifications
You must be signed in to change notification settings - Fork 104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for resources when packaging using the SwiftPM plugin #333
Add support for resources when packaging using the SwiftPM plugin #333
Conversation
Looks like this address issue #312 |
@camdenfullmer Thank you for this PR. It looks like a legitimate idea and simple implementation I would propose to add a minimal example Lambda function to show how to use this capability and a section in the README file to document this. Question: why I left comments on the code |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few questions and suggestions. Thank you for having submitted this
@@ -202,8 +202,27 @@ struct AWSLambdaPackager: CommandPlugin { | |||
try FileManager.default.copyItem(atPath: artifactPath.string, toPath: relocatedArtifactPath.string) | |||
try FileManager.default.createSymbolicLink(atPath: symbolicLinkPath.string, withDestinationPath: relocatedArtifactPath.lastComponent) | |||
|
|||
// add resources | |||
let contentsDirectory = workingDirectory.appending("Contents") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we really need a Contents
directory ? Maybe Resources
is enough
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After some more testing the correct bundle to use is Bundle.module
. So instead of recreating the Contents
directory I am just copying the .resources
directory that is in the artifacts directory to the working directory to be zipped. This has the benefit of working on Lambda as well as when running locally on macOS.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let artifactDirectory = artifactPath.removingLastComponent() | ||
let resourcesDirectoryName = try FileManager.default.contentsOfDirectory(atPath: artifactDirectory.string) | ||
.first(where: { $0.hasSuffix(".resources") && $0.contains(product.name) }) | ||
if let resourcesDirectoryName { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would use guard
or if
on line 210. This line is not necessary
@swift-server-bot test this please |
@swift-server-bot test this please |
@camdenfullmer Thank you for having submitted this PR. We're considering merging it in the main branch before we start work on v2. |
Yep will get right on it. Will try to have changes and feedback by the end of the week! |
@@ -67,6 +67,7 @@ struct AWSLambdaPackager: CommandPlugin { | |||
|
|||
// create the archive | |||
let archives = try self.package( | |||
packageName: context.package.displayName, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wasn't sure if there was a better way to get the package name when creating the resources directory name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is the only way to retrieve a package name.
See https://github.com/swiftlang/swift-package-manager/blob/b24cc8b547f952ee4a954db939f115a26946fe2b/Sources/PackagePlugin/PackageModel.swift#L16
The other option is to use the directory name but it's not necessarily the same.
@swift-server-bot test this please |
@camdenfullmer Thank you for the update. I tested the code on different variations of your sample project. It works like a charm,
|
I changed the year to something that will pass, but maybe the script should be updated to allow for |
@swift-server-bot test this please |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This change updates the SwiftPM plugin to include the executable's resources in the archive.
Motivation:
When deploying a Lambda function that generates HTML content I needed a way to package template HTML files along with the executable. Defining the resources in the
Package.swift
and then packaging them in the archive in a way so that Swift can access them usingBundle.main.resourceURL
felt like the best way to accomplish this.Example:
Modifications:
Plugin code has been modified to generate a
Contents/Resources
directory inside the final archive which includes the resources defined in the executable's target fromPackage.swift
.Result:
The zip archive includes the defined resources in
Package.swift
.